// let obj = {
//   name: "张三",
// };

// // let obj2 = obj; // 创建一个强引用

// let obj2 = new WeakRef(obj); // obj2 就是一个 obj 的弱引用

// console.log(obj2.deref());

// obj = null;
// // 🤔 垃圾回收器能否回收 obj 所指向的对象？
// // 回答：可以回收

// console.log(obj2.deref()); // 有可能会返回对象，也有可能返回 undefined，取决于 GC 是否运行

// const registry = new FinalizationRegistry((heldValue) => {
//   // ...
//   console.log(`对象已经被回收，接收到额外传递过来的参数${heldValue}`);
// });

// let obj = {
//   name: "张三",
// };

// // 进行注册
// registry.register(obj, "附加值");

// obj = null; // 断开和对象的链接

// // 在未来的某个时间点，当 GC 回收 obj 原本所指向的对象的时候，回调函数就会执行

// 数据库连接池
const DatabasePool = {
  activeConnections: new Set(), // 存储所有的数据库连接

  register(name) {
    this.activeConnections.add(name);
    console.log(`注册连接：${name}`);
  },

  unregister(name) {
    this.activeConnections.delete(name);
    console.log(`已注销连接：${name}`);
  },

  list() {
    console.log("当前活跃连接：", [...this.activeConnections]);
  },
};

// 数据库连接类
class DatabaseConnection {
  constructor(name) {
    this.name = name;
    this.isConnected = true;
    console.log(`已连接至 ${this.name} 数据库`);
    DatabasePool.register(this.name); // 在数据库连接池进行了注册
  }

  close() {
    if (this.isConnected) {
      this.isConnected = false;
      console.log(`已关闭 ${this.name} 数据库`);
    }
  }
}

// 期望该数据库连接断开的时候，从数据库连接池移除该数据库连接
// 需求：不是数据库关闭的时候从数据库连接池移除
// 而是该数据库连接被 GC 回收的时候再从数据库连接池移除

const registry = new FinalizationRegistry((heldValue) => {
  heldValue.cleanup();
});

let conn = new DatabaseConnection("MongoDB");

registry.register(conn, {
  name: "MongoDB",
  cleanup() {
    console.log("连接对象已经被清理，做后续操作");
    DatabasePool.unregister(this.name);
  },
});

conn.close();

conn = null; // 期望该链接被 GC 回收的时候，做一些后续的事情（从数据库连接池做一个删除）
